package yiran.agift.command;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import yiran.agift.AGift;
import yiran.agift.gui.GiftViewGUI;
import yiran.agift.lang.LangHelper;

public class GiftCommand implements CommandExecutor {
    /**
     * 处理命令发送者发送的命令
     *
     * @param sender 命令发送者，可以是玩家或控制台
     * @param cmd    被执行的命令对象
     * @param label  命令的别名
     * @param args   命令的参数数组
     * @return true 如果命令被执行；否则返回false
     */
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        // 如果没有提供参数，则显示帮助信息
        if (args.length == 0) return sendHelp(sender);

        // 根据第一个参数决定执行的操作
        switch (args[0].toLowerCase()) {
            case "create":
                // 处理创建操作
                return handleCreate(sender, args);
            case "edit":
                // 处理编辑操作
                return handleEdit(sender, args);
            case "give":
                // 处理给予操作
                return handleGive(sender, args);
            case "sendmail":
                // 处理发送邮件操作
                return handleSendMail(sender, args);
            case "delete":
                // 处理删除操作
                return handleDelete(sender, args);
            case "reload":
                // 处理重新加载配置操作
                return handleReload(sender);
            case "view":
                // 处理查看操作
                return handleView(sender, args);
            case "help":
            default:
                // 默认情况下显示帮助信息
                return sendHelp(sender);
        }
    }

    /**
     * 处理查看礼物界面的请求
     *
     * @param sender 命令的发送者
     * @param args 命令的参数数组，其中包含礼物ID
     * @return 总是返回true，表示命令处理完成
     */
    private boolean handleView(CommandSender sender, String[] args) {
        // 检查参数数量是否足够，如果不足则发送使用帮助信息
        if (args.length < 2) {
            sendHelp(sender);
            return true;
        }

        int giftId;
        try {
            // 将参数转换为礼物ID，如果转换失败则发送无效ID的错误信息
            giftId = Integer.parseInt(args[1]);
        } catch (NumberFormatException e) {
            sender.sendMessage(LangHelper.getString("error.invalid_id"));
            return true;
        }

        // 检查发送者是否为玩家，因为只有玩家可以打开界面
        if (!(sender instanceof Player)) {
            sendHelp(sender);
            return true;
        }

        // 将发送者转换为玩家对象，并调用方法打开礼物查看界面
        Player player = (Player) sender;
        GiftViewGUI.open(player, giftId);
        return true;
    }

    /**
     * 处理创建礼物的命令
     *
     * @param sender 命令发送者，可以是玩家或控制台
     * @param args 命令参数数组，包含礼物名称等信息
     * @return boolean 总是返回true，表示命令处理完成
     */
    private boolean handleCreate(CommandSender sender, String[] args) {
        // 检查命令发送者是否具有必要的权限
        if (!sender.hasPermission("agift.admin")) {
            sender.sendMessage(LangHelper.getString("error.no_permission"));
            return true;
        }
        // 确保命令只能由玩家执行，防止通过控制台执行
        if (!(sender instanceof Player)) {
            sendHelp(sender);
            return true;
        }
        // 检查命令参数长度，确保至少包含礼物名称
        if (args.length < 2) {
            sendHelp(sender);
            return true;
        }
        // 将命令发送者转换为玩家类型，并打开礼物创建界面
        Player player = (Player) sender;
        AGift.getInstance().getGiftEditor().openCreationGUI(player, args[1]);
        return true;
    }

    /**
     * 处理编辑礼物的命令
     *
     * @param sender 命令发送者，可以是玩家或其他命令发送实体
     * @param args 命令参数数组，包含命令后的各个参数
     * @return boolean 表示命令处理是否成功
     */
    private boolean handleEdit(CommandSender sender, String[] args) {
        // 检查发送者是否有足够的权限编辑礼物
        if (!sender.hasPermission("agift.admin")) {
            sender.sendMessage(LangHelper.getString("error.no_permission"));
            return true;
        }
        // 确保命令发送者是玩家，因为编辑礼物需要交互界面
        if (!(sender instanceof Player)) {
            sendHelp(sender);
            return true;
        }
        // 检查命令参数长度，确保至少包含礼物ID
        if (args.length < 2) {
            sendHelp(sender);
            return true;
        }

        Player player = (Player) sender;
        int giftId;
        try {
            // 将礼物ID从字符串转换为整数
            giftId = Integer.parseInt(args[1]);
        } catch (NumberFormatException e) {
            // 如果转换失败，说明礼物ID格式无效
            sender.sendMessage(LangHelper.getString("error.invalid_id"));
            return true;
        }

        // 打开礼物编辑界面，让玩家编辑指定的礼物
        AGift.getInstance().getGiftEditor().openEditGUI(player, giftId);
        return true;
    }

    /**
     * 处理赠送礼物命令
     *
     * @param sender 命令发送者
     * @param args 命令参数数组，包含礼物接收者名称和礼物ID
     * @return 命令处理结果，始终返回true表示命令已被处理
     */
    private boolean handleGive(CommandSender sender, String[] args) {
        // 检查命令发送者是否具有管理员权限
        if (!sender.hasPermission("agift.admin")) {
            sender.sendMessage(LangHelper.getString("error.no_permission"));
            return true;
        }
        // 检查命令参数数量是否符合要求
        if (args.length < 3) {
            sendHelp(sender);
            return true;
        }
        // 根据命令参数获取目标玩家对象
        Player target = Bukkit.getPlayer(args[1]);
        // 检查目标玩家是否存在
        if (target == null) {
            sender.sendMessage(LangHelper.getString("error.player_not_found"));
            return true;
        }
        int giftId;
        try {
            // 将命令参数转换为礼物ID
            giftId = Integer.parseInt(args[2]);
        } catch (NumberFormatException e) {
            // 处理无效礼物ID格式
            sender.sendMessage(LangHelper.getString("error.invalid_id"));
            return true;
        }
        // 获取指定ID的礼物物品数组
        ItemStack[] giftItems = AGift.getInstance().getGiftManager().getGift(giftId);
        // 检查礼物是否存在
        if (giftItems == null) {
            sender.sendMessage(LangHelper.getString("gift.not_found"));
            return true;
        }
        // 将礼物物品添加到目标玩家的背包中
        for (ItemStack item : giftItems) {
            if (item != null) {
                target.getInventory().addItem(item.clone());
            }
        }
        // 通知命令发送者礼物已成功赠送
        sender.sendMessage(LangHelper.getString("gift.given").replace("%player%", target.getName()));
        return true;
    }

    /**
     * 处理发送邮件的命令
     *
     * @param sender 命令发送者，可能是玩家或控制台
     * @param args 命令参数数组，预期格式: [玩家名, 礼物ID]
     * @return 总是返回true，表示命令处理完成
     */
    private boolean handleSendMail(CommandSender sender, String[] args) {
        // 权限检查：只有拥有agift.admin权限的用户可以执行
        if (!sender.hasPermission("agift.admin")) {
            sender.sendMessage(LangHelper.getString("error.no_permission"));
            return true;
        }

        // 参数数量验证：至少需要玩家名和礼物ID两个参数
        if (args.length < 3) {
            sendHelp(sender);
            return true;
        }

        // 获取目标玩家对象
        Player target = Bukkit.getPlayer(args[1]);
        if (target == null) {
            sender.sendMessage(LangHelper.getString("error.player_not_found"));
            return true;
        }

        // 解析礼物ID并验证格式
        int giftId;
        try {
            giftId = Integer.parseInt(args[2]);
        } catch (NumberFormatException e) {
            sender.sendMessage(LangHelper.getString("error.invalid_id"));
            return true;
        }

        // 验证礼物ID是否存在
        if (AGift.getInstance().getGiftManager().getGift(giftId) == null) {
            sender.sendMessage(LangHelper.getString("gift.not_found"));
            return true;
        }

        // 执行发送礼物到邮箱的操作
        AGift.getInstance().getMailboxManager().sendGiftToMailbox(target.getUniqueId(), giftId);
        sender.sendMessage(LangHelper.getString("gift.sent").replace("%player%", target.getName()));
        return true;
    }

    /**
     * 处理删除礼物命令
     *
     * @param sender 命令发送者
     * @param args 命令参数，包括礼物ID
     * @return 命令处理结果，true表示成功处理，false表示处理失败
     */
    private boolean handleDelete(CommandSender sender, String[] args) {
        // 检查命令发送者是否具有删除礼物的权限
        if (!sender.hasPermission("agift.admin")) {
            sender.sendMessage(LangHelper.getString("error.no_permission"));
            return true;
        }
        // 检查命令参数是否足够
        if (args.length < 2) {
            sendHelp(sender);
            return true;
        }
        int giftId;
        try {
            // 将礼物ID从字符串转换为整数
            giftId = Integer.parseInt(args[1]);
        } catch (NumberFormatException e) {
            // 如果礼物ID格式不正确，则发送错误消息
            sender.sendMessage(LangHelper.getString("error.invalid_id"));
            return true;
        }
        // 调用GiftManager的deleteGift方法删除指定礼物
        AGift.getInstance().getGiftManager().deleteGift(giftId);
        // 发送礼物删除成功的消息
        sender.sendMessage(LangHelper.getString("gift.deleted"));
        return true;
    }

    /**
     * 处理重载配置的命令
     * 该方法首先检查发送者是否具有重载配置的权限如果没有权限，则发送无权限消息并返回true
     * 如果有权限，则尝试重载配置文件和语言资源重载成功后，发送成功消息
     * 如果重载过程中发生异常，则发送错误消息并打印异常堆栈
     *
     * @param sender 命令的发送者，可以是玩家或控制台
     * @return 总是返回true，表示命令处理完成
     */
    private boolean handleReload(CommandSender sender) {
        // 检查发送者是否具有管理员权限
        if (!sender.hasPermission("agift.admin")) {
            sender.sendMessage(LangHelper.getString("error.no_permission"));
            return true;
        }
        try {
            // 重载配置文件和语言资源
            AGift.getInstance().reloadConfig();
            LangHelper.reload();
            // 发送重载成功消息
            sender.sendMessage(LangHelper.getString("config.reloaded"));
        } catch (Exception e) {
            // 发送重载错误消息并打印异常堆栈
            sender.sendMessage(LangHelper.getString("error.reload"));
            e.printStackTrace();
        }
        return true;
    }

    /**
     * 向命令发送者发送帮助信息
     * <p>
     * 此方法用于响应用户输入的命令，通过发送一系列预定义的帮助信息消息给用户，
     * 帮助用户了解如何使用相关命令该方法体现了程序的人机交互界面的一部分，
     * 通过友好的提示信息提升用户体验
     *
     * @param sender 命令的发送者，可以是玩家、控制台或其他命令执行实体
     * @return boolean 总是返回false，表示命令处理未成功完成（在这个上下文中，
     *         发送帮助信息并不视为命令执行成功）
     */
    private boolean sendHelp(CommandSender sender) {
        // 遍历配置文件中定义的命令帮助信息，并逐条发送给命令发送者
        LangHelper.getStringList("command.help").forEach(sender::sendMessage);
        return false;
    }

}


